Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

C/C++本地代码调试

帖子发起人: robinking   发起时间: 2009-04-15 17:04 下午   回复: 2

Print Search
帖子排序:    
   2009-04-15, 17:04 下午
robinking 离线,最后访问时间: 2015/4/28 3:18:23 robinking

发帖数前200位
注册: 2009-03-27
发 贴: 4
IDebugControl下断的问题
Reply Quote
大家帮我分析一下
MFC 按钮1 事件处理方法中{
Hr = DebugClient->CreateProcessAndAttach (0,"c:\\windows\\notepad.exe",DEBUG_PROCESS,0,DEBUG_ATTACH_NONINVASIVE);
Hr = DebugClient->QueryInterface (__uuidof(IDebugControl),(void **)&g_ExtControl);
Hr = DebugClient->SetEventCallbacks (&myCallBacks);
hr = g_ExtControl->WaitForEvent (0,1000);
}
按钮2 处理方法
{
g_ExtControl->OpenLogFile("c:\\111.log",true);

//DbgUiRemoteBreakin
//Hr = g_ExtControl->SetInterrupt (DEBUG_INTERRUPT_ACTIVE);
Status = g_ExtControl->Execute (DEBUG_OUTCTL_LOG_ONLY,"bp MessageBoxW",DEBUG_EXECUTE_NOT_LOGGED);
//上一行的代码执行完就会在c:\111.log写下日志,内容如下:
/* 111.log 内容
Opened log file 'c:\111.log'
WARNING: The debugger does not have a current process or thread
WARNING: Many commands will not work
^ Illegal thread error in 'bp MessageBoxW'
*/
}
这个错误是什么意思呢,是说我没有Attach 成功,还是说我没有把目标中断下来,怎么让系统中断下来呢?IDebugClient或IDebugControl有相关的方法吗?
IP 地址: 已记录   报告
   2009-04-15, 22:03 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: IDebugControl下断的问题
Reply Quote
是因为你指定了DEBUG_ATTACH_NONINVASIVE标志,这个标志意味着开始一个非入侵式调试会话(《软件调试》P925),这样的调试会话是不可以设置断点和进行跟踪的。
IP 地址: 已记录   报告
   2009-04-17, 18:41 下午
robinking 离线,最后访问时间: 2015/4/28 3:18:23 robinking

发帖数前200位
注册: 2009-03-27
发 贴: 4
Re: IDebugControl下断的问题
Reply Quote
非常感谢张老师,在完成一系列方法调用完成后一定用Hr = g_ExtControl->WaitForEvent (0,INFINITE);使系统开始事件处理。(如果这里不使用INFINITE,而是2000,则两秒后被调试程序挂起)

当别调试程序处于运行状态时,按F12即可激发回调函数Exception的执行,在此处进行处理:
HRESULT MyCallBacks::Exception(__in PEXCEPTION_RECORD64 Exception, __in ULONG FirstChance ) {

::HRESULT Status;
if( FirstChance != 0 ){
Status = g_ExtControl->Execute (DEBUG_OUTCTL_LOG_ONLY,"r eip;u eip",DEBUG_EXECUTE_ECHO);
//g_ExtControl->SetExecutionStatus(DEBUG_STATUS_GO );
return DEBUG_STATUS_GO;
}
return S_OK;
}
这里就可以 u EIP 命令执行就没有错误了。
另外在书中看到了几个异步阻断的方法,不知道IDebugClient,IDebugControl有没有方法调用异步阻断,等有时间在研究下,谢谢张老师!!
IP 地址: 已记录   报告
高端调试 » 软件调试 » C/C++本地代码调试 » IDebugControl下断的问题

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.